
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>消息流量控制过滤实现 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>消息流量控制过滤实现 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">RocketMQ Producer端有哪些主要的客户端限流方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要有三种方法：1. 通过 `setAsyncSenderExecutor` 自定义线程池来控制异步发送的并发量；2. 通过批量发送消息 `send(Collection<Message>)` 来减少网络交互；3. 通过设置 `sendMsgTimeout` 参数来控制发送超时时间，从而间接控制流量。</div>
          </div>
          <div class="card-source">来源: 1.1 客户端限流</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当某个Broker响应缓慢或失败率高时，RocketMQ Producer的“故障规避”机制是如何工作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当Producer检测到某个Broker的响应时间过长或失败率过高时，它会暂时将该Broker加入一个规避列表中，从而减少向这个有问题的Broker发送消息，实现故障规避。</div>
          </div>
          <div class="card-source">来源: 2. 流控与背压机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">RocketMQ中单条消息的默认最大限制是多少？如何修改这个限制？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">单条消息的默认最大长度为4MB。可以通过修改Broker配置文件中的 `maxMessageSize` 参数来进行调整。</div>
          </div>
          <div class="card-source">来源: 1.2 限制单次发送消息大小</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">RocketMQ Consumer端主要通过哪两种方式来控制消费速率？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要通过两种方式：1. 批量消费设置，通过 `setConsumeMessageBatchMaxSize` 参数设置一次消费的消息数量；2. 消费频率控制，通过 `setPullInterval` 参数设置消费线程每次拉取消息的间隔时间。</div>
          </div>
          <div class="card-source">来源: 2. 消费速率控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在CLUSTERING模式下，消费者如何利用返回状态来实现手动的消费流控？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">消费者在处理消息时，可以根据自身的业务处理能力决定返回的状态。如果当前无法处理，可以返回 `ConsumeConcurrentlyStatus.RECONSUME_LATER`，这会使消息稍后被重试，从而达到了延迟消费、控制速率的效果。</div>
          </div>
          <div class="card-source">来源: 4. 手动ACK控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Broker端会基于哪些系统资源使用情况来触发写入限流？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Broker端会监控两种系统资源：1. 内存占用，当内存使用率超过阈值时会拒绝新消息写入；2. 磁盘使用率，当磁盘使用率超过阈值时同样会拒绝新消息写入。</div>
          </div>
          <div class="card-source">来源: 1.2 发送消息流控</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">相较于开源版，RocketMQ商业版提供了哪些更精细的流控功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">商业版提供了三种更精细的流控功能：1. 基于Topic的流控，可为不同Topic设置不同策略；2. 基于时间窗口的流控，在指定时间窗口内限制消息量；3. 动态流控，能根据系统负载动态调整流控阈值。</div>
          </div>
          <div class="card-source">来源: 3. 商业版特有的流控功能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">为了保障系统稳定，除了配置流控参数，还应建立什么样的配套措施？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">应建立完善的监控与告警系统。需要监控的关键指标包括：消息发送/消费的TPS和RT、消息堆积量以及Broker的资源使用率（CPU、内存、磁盘、网络）。当这些指标超过预设阈值时，应及时触发告警。</div>
          </div>
          <div class="card-source">来源: 2. 监控与告警</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">实践</div>
          <div class="card-question">为什么说流控策略需要动态调优？调优的基本原则是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为业务流量和系统负载是不断变化的，固定的流控参数无法适应所有情况。调优的基本原则是：在业务低峰期适当放宽限制以提高资源利用率；在业务高峰期适当收紧限制以保证系统稳定性，并最终结合压力测试结果来确定最佳配置。</div>
          </div>
          <div class="card-source">来源: 3. 流控策略调优</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
